#ifndef ZL_BASIC
#define ZL_BASIC

#include <cassert>
#include <type_traits>

namespace zl
{
#ifdef           _MSC_VER
#ifdef           ZL_64
	typedef  __int64         zint;
	typedef signed __int64			zsint;
	typedef unsigned __int64		zuint;
#else
	typedef  __int32              zint;
	typedef  signed  __int32      zsint;
	typedef  unsigned __int32     zuint;
#endif
	typedef  signed __int64   pos_t;
#else
#ifdef            ZL_64
	typedef  long long          zint;
	typedef  signed long long   zsint;
	typedef  unsigned long long  zuint;
#else
	typedef  int               zint;
	typedef  signed int        zsint;
	typedef  unsigned  int     zuint;
#endif
	typedef  long long        pos_t;
#endif
	
	class Object
	{
	public:
		virtual ~Object();
	};

	class NotCopyable
	{
	public:
		NotCopyable();
	private:
		NotCopyable(const NotCopyable&);
		NotCopyable& operator =(const NotCopyable&);
	};

	class Interface :private NotCopyable
	{
	public:
		virtual ~Interface();
	};

	template<typename T>
	struct KeyType
	{
	public:
		typedef T Type;

		static T GetKeyValue(const T& value)
		{
			return value;
		}
	};
};
#endif